<template>
	<view>
		<view class="cu-modal" :class="isAutoShow == true ?'show':''" @tap="hideModal">
			<view class="cu-dialog" @tap.stop="">
				<view class="cu-avatar xl round shadow-warp bg-img" style="background-image: url(/static/common.jpg);"></view>
				<view class="text-lg padding-top">授权提醒</view>
				<view class="padding-lr padding-tb text-sm">
					请授权头像等信息，以便为您提供更好的服务
				</view>
				<view class="btn-height margin-top-sm flex">
					<view class="submit bg-gray text-grey flex align-center justify-center" @tap="hideModal">随便逛逛</view>
					<view class="submit bg-red flex align-center justify-center">
						<button class="cu-btn bg-red response" open-type="getUserInfo" @getuserinfo="getUserInfo" lang="zh_CN">授权登录</button>
					</view>
				</view>
			</view>
		</view>
	</view>
</template>

<script>
	const app = getApp()
	import user from '@/common/user.js'
	import util from '@/common/util.js'
	export default {
		data: function() {
			return {
				errorNum: 3, // 错误次数
				errorSum: 0,
				isAutoShow: this.isShow, // Vue会发出单向数据流警告，需要定义一个属性
				// 此处最好改成 _isShow，以便区分
			}
		},
		props: {
			isShow: { // 是否显示弹窗
				type: Boolean,
				default: false
			},
			isGoIndex: { // 是否跳转首页
				type: Boolean,
				default: false
			},
			isAutoLogin: { // 是否自动登录
				type: Boolean,
				default: false
			}
		},
		/* 渲染前执行，相当于微信小程序的 attached */
		beforeMount() {
			this.checkLoginStatus()
		},
		methods: {
			/* 检查登录状态并执行自动登录 */
			checkLoginStatus() {
				user.checkLoginStatus().then((res) => {
					// let pages = getCurrentPages()
					// let currentPage = pages[pages.length - 1]
					// if (currentPage && currentPage.data.isShow != undefined) {
					// 	currentPage.data.isShow = false
					// }
					if (res.isLogin) {
						if (!user.checkLogin()) {
							// 已经授权，但是 token 已失效情况，重新发起登录
							return Promise.reject({
								authSetting: true,
								msg: 'token已经失效',
								userInfo: res.userInfo
							})
						}
						let token = uni.getStorage({
							key: 'token',
							success: (res) => {
								this.$api.myToken(res.data)
							}
						})
						
						// 已经授权，已登录，将数据传给父组件(按需)，若未登录，则去登录
						uni.$emit('listenAuthorize', getApp().globalData.userInfo)
					} else {
						this.getUserInfo(res.userInfo, true)
					}
				}).catch(err => {
					// 未授权，未登录，自动弹出授权窗
					if (err.authSetting === false) {
						// 某些页面没有授权不会自动弹窗，阻止继续执行
						if (this.isAutoLogin === false) return;
						this.isAutoShow = true
					} else if (err.authSetting) {
						// 已经授权登录后，token 失效的情况
						this.getUserInfo(err.userInfo, false)
					}
				})
			},
			/* 获取登录 code 和用户静默信息 */
			getUserInfo(userInfo, isLogin) {
				if (isLogin) {
					// 直接登录
					uni.showLoading({
						title: '正在登录中'
					})
					this.getAuthUserInfo(userInfo)
				} else {
					// 获取 code
					user.getLoginCode((res) => {
						// 获取当前用户信息（未授权）
						user.getUserInfo().then(userInfo => {
							uni.showLoading({
								title: '正在登录中'
							})
							userInfo.code = res.code
							this.getAuthUserInfo(userInfo)
						}).catch(err => {
							uni.hideLoading()
							util.Toast({title:'已取消'})
						})
					})
				}
			},
			/* 向后台服务器发起登录请求 */
			async getAuthUserInfo(userInfo) {
				userInfo.spread_id = getApp().globalData.spreadId; //推荐人 ID
				userInfo.spread_code = getApp().globalData.spreadCode; //推荐人分享的二维码 ID
				try {
					let res = await this.$api.userAuthorize(userInfo)
					getApp().globalData.token = res.data.data.token // 这个在js里没法取值
					uni.setStorageSync('token', res.data.data.token) // 缓存传，然而取到的是上一次的值
					this.$api.myToken(res.data.data.token) // 只能通过方法传,但是其他地方就没有了token，还是要保存到缓存里，两个一起存
					getApp().globalData.isLogin = true
					getApp().globalData.userInfo = res.data.data
					getApp().globalData.expiredTime = res.data.expired_time
					if (res.data.cache_key) {
						uni.setStorage({
							key: 'cache_key',
							data: res.data.cache_key
						})
					}
					uni.hideLoading()
					this.isAutoShow = false
					// 已经授权，已登录，将数据传给父组件
					uni.$emit('listenAuthorize', res.data.data.token) // 参数传，太麻烦了
				} catch(err) {
					uni.hideLoading()
					this.errorSum++
					this.errorSum = this.errorSum
					if (this.errorSum >= this.errorNum) {
						console.log(err);
						util.Toast({ title: err.msg })
					} else {
						this.getUserInfo(userInfo, false) // 重新发起授权
					}
				}
			},
			hideModal() {
				if (this.isGoIndex) {
					wx.switchTab({
						url: '/pages/index/index'
					})
				} else {
					this.isAutoShow = false
					// let pages = getCurrentPages()
					// let currentPage = pages[pages.length - 1]
					// if (currentPage && currentPage.data.isShow != undefined) {
					// 	currentPage.data.isShow = false
					// }
				}
			}
		},

	}
</script>

<style lang="scss">
	.cu-dialog {
		width: 540upx;
		overflow: initial;

		.cu-avatar {
			margin-top: -64upx;
			border: 4upx solid $uni-bg-color-grey;
		}

		.btn-height {
			height: 80upx;

			.submit {
				height: 100%;
				width: 50%;
			}
		}
	}
</style>
